package com.fly.lambda;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

import com.fly.lambda.entity.Trader;
import com.fly.lambda.entity.Transaction;

public class TraderTest
{
    private static List<Transaction> transactions = new ArrayList<>();
    
    static
    {
        Trader raoul = new Trader("Raoul", "Cambridge");
        Trader mario = new Trader("Mario", "Milan");
        Trader alan = new Trader("Alan", "Cambridge");
        Trader brian = new Trader("Brian", "Cambridge");
        
        transactions.add(new Transaction(brian, 2011, 300));
        transactions.add(new Transaction(raoul, 2012, 1000));
        transactions.add(new Transaction(raoul, 2011, 400));
        transactions.add(new Transaction(mario, 2012, 710));
        transactions.add(new Transaction(mario, 2012, 700));
        transactions.add(new Transaction(alan, 2012, 950));
    }
    
    public static void main(String[] args)
    {
        // (1) 找出2011年发生的所有交易，并按交易额排序（从低到高）。
        transactions.stream()
            .filter(transaction -> transaction.getYear() == 2011) // 过滤出2011年的交易
            .sorted(Comparator.comparing(Transaction::getValue)) // 按交易额升序
            .forEach(System.out::println); // 打印结果
        
        // (2) 交易员都在哪些不同的城市工作过？
        transactions.stream()
            .map(transaction -> transaction.getTrader().getCity()) // 获取所有的城市字符串
            .distinct() // 去重
            .forEach(System.out::println); // 打印结果
        
        // (3) 查找所有来自于剑桥的交易员，并按姓名排序。
        transactions.stream()
            .filter(transaction -> "Cambridge".equals(transaction.getTrader().getCity())) // 过滤出所有的剑桥交易
            .map(Transaction::getTrader) // 获取交易中的交易员对象
            .distinct() // 去重
            .sorted(Comparator.comparing(Trader::getName)) // 按照姓名升序
            .forEach(System.out::println); // 打印结果
        
        // (4) 返回所有交易员的姓名字符串，按字母顺序排序。
        transactions.stream()
            .map(transaction -> transaction.getTrader().getName()) // 获取交易中的所有交易员姓名
            .distinct() // 姓名去重
            .sorted() // 升序排序
            .forEach(System.out::println); // 打印结果
        
        // (5) 有没有交易员是在米兰工作的？
        boolean match = transactions.stream().anyMatch(transaction -> "Milan".equals(transaction.getTrader().getCity())); // 匹配到任意一个都为true
        System.out.println("有没有交易员在米兰工作的  " + match);
        
        // (6) 打印生活在剑桥的交易员的所有交易额。
        int sum = transactions.stream()
            .filter(transaction -> "Cambridge".equals(transaction.getTrader().getCity())) // 过滤出生活在剑桥的交易员的所有交易
            .mapToInt(Transaction::getValue) // 获取交易额
            .sum(); // 求和
        System.out.println("生活在剑桥的交易员的所有交易额  " + sum);
        
        // (7) 所有交易中，最高的交易额是多少？
        Integer mount = transactions.stream()
            .max(Comparator.comparingInt(Transaction::getValue)) // 获取最大的金额交易
            .get() // 获取对象
            .getValue(); // 获取金额
        System.out.println("所有交易中，最高的交易额是 " + mount);
        
        // (8) 找到交易额最小的交易。
        Transaction transaction = transactions.stream()
            .min(Comparator.comparing(Transaction::getValue)) // 获取交易额最小的交易
            .get(); // 获取对象
        System.out.println("交易额最小的交易  " + transaction);
    }
}
